package com.cskaoyan.javase.oop2._1extends._5hierarchy;

import com.sun.xml.internal.bind.v2.util.FatalAdapter;

/**
 * 继承层次
 * 思考:
 *      1.Java中的一个类,它只有一个直接父类吗?
 *          是的,通过extends关键字,任何Java类都只有一个直接父类
 *          像这种面向对象的继承设计,就是"单继承","单重继承"
 *          任何类都只有一个直接父类
 *          与之相对应的就是C++当中的"多继承": 任何类允许有多个直接父类
 *
 *     2.Java中的一个类,它只有一个父类吗?
 *          不是,虽然直接父类只有一个,但是直接父类还有直接父类
 *          也就是说子类可以有很多个间接父类
 *
 *          比如A继承B，B又继承了C，那么A的直接父类就是B，间接父类是C。
 *          于是就形成了下面几个概念：
 *              a.祖先类：处在继承顶层的类。
 *                   在Java当中,处在最顶层的类(它上面再没有父类了),是Object类
 *                   Object类是Java中所有类的父类
 *                   Java中的所有类都要继承Object
 *
 *                   Object类的继承是如何继承的?
 *                      1.如果某个类没有用extends关键字,声明它的直接父类
 *                          那么它的直接父类就是Object,这是一个隐式继承,无需写出来.
 *                      2.如果某个类已经用extends关键字,直接声明了父类
 *                          那么Object就是它的间接父类,因为肯定向上能够找到一个类直接继承Object
 *                          所以Java任何类都要继承Object
 *
 *              b.继承层次（hierarchy）：由某个祖先类派生出来的所有类的集合叫做继承层次。
 *              c.继承链：从某一个子类开始，到其祖先类的路径。
 *
 *
 * 结论:
 *      1.在一条继承链中的，下游的类总是继承上游类的所有成员，不管隔了几层。
 *      2.在一条继承链中，总称呼下游类是上游类的子类，不管隔了几层。
 *          没有孙子类或者重孙类这种概念。
 *          -->
 *          既然一条继承链下游的都是子类,子类"is-a"父类
 *          那么下游类,总是可以看成一个上游类,具有"is-a"关系.
 *
 *      3.不在同一条继承链中的类，没有任何关系。虽然看起来像"兄弟姐妹"类，但是Java是不讲究血统的。
 *          不在同一条继承链中,没有任何关系,不能做任何操作.
 *          比如类型转换,比如成员的继承,前提都是在一条继承链当中.
 *          向上转型,指的是在同一条继承链中向上转换类型
 *
 * @since 11:21
 * @author wuguidong@cskaoyan.onaliyun.com
 */

public class Demo {
    public static void main(String[] args) {
        // Son s = new Son();
        // s.equals()

        /*Grandson gs = new Grandson();
        System.out.println(gs.fVar);
        System.out.println(gs.sVar);*/
        // uVar不在一条继承链中
        // gs.uVar

        // 请问,new创建Grandson对象,有几种方式?
        Grandson gs = new Grandson();
        Son s = new Grandson();
        Father f = new Grandson();
        Grandfather gf = new Grandson();
        // Uncle u = new Grandson();
        // 任何类都是Object的子类,那么Object引用可以指向Java任何对象
        Object o = "123";
        o = new int[3];
        o = new String[3];
        o = new Grandson();
    }
}

// "爷爷类"
// Class 'Grandfather' explicitly extends 'java.lang.Object'
class Grandfather {
    int gfVar;
}
// Cyclic inheritance involving 'com.cskaoyan.javase.oop2._1extends._5hierarchy.Grandfather'
// class Grandfather extends Grandson{
//     int gfVar;
// }

// "爸爸类"
class Father extends Grandfather {
    int fVar;
}

class Uncle extends Grandfather {
    int uVar;
}
// Class cannot extend multiple classes
// class Son extends Father, Uncle {}

// "儿子类"
class Son extends Father {
    int sVar;
}

// "孙子类"
class Grandson extends Son {
    int gsVar;
}
// Class 'Object' explicitly extends 'java.lang.Object'
// class Object extends java.lang.Object{
// }
